home *** CD-ROM | disk | FTP | other *** search
/ Freaks Macintosh Archive / Freaks Macintosh Archive.bin / Freaks Macintosh Archives / Macintosh / Development & Resource Tools / ROM Sucker.sit / ROM Sucker / src / ROM_Sucker.s next >
Text File  |  1998-01-04  |  43KB  |  1,719 lines

  1. ******************************
  2. *  ROM Sucker
  3. *  Adapted from 680x0 to PPC assembly language
  4. *  Started:  November 24, 1997
  5. *  Modified: January 3, 1998
  6.  
  7. *  
  8. *  Resizing window when scrolled causes havoc with control values, etc.
  9. *    So live with it.  This is just a hack, after all.
  10. *  
  11.  
  12. bss:    reg    r30            ;global data register
  13.  
  14. Start:
  15.     ENTRY
  16.     start_up            ;save r0, r10 - r31 and set up r30 for globals
  17.     la    r3,qd(`bss)        ;I-2-36: QuickDraw global variables
  18.     addic    r3,r3,208-4
  19.     Xcall    InitGraf        ;I-2-36
  20.     Xcall    InitFonts        ;T-4-51
  21.     Xcall    InitWindows        ;TE-4-75
  22.     Xcall    InitMenus        ;TE-3-103
  23.     Xcall    TEInit            ;T-2-77
  24.     li    r3,0        
  25.     Xcall    InitDialogs        ;TE-6-103
  26.     Xcall    InitCursor        ;I-8-22
  27.  
  28. SetupStuff:
  29.     li    r3,TRUE
  30.     sth    r3,NormalScroll(`bss)    ;set up scroll behavior
  31.  
  32.     li    r3,FALSE
  33.     sth    r3,DARefNum(`bss)    ;use as a flag that a DA is open
  34.  
  35.     Xcall    GetCaretTime        ;TE-2-113 (yeah, I know it’s in a global variable)
  36.     sth    r3,MyCaretTime(`bss)    ;caret blinking interval in ticks
  37.  
  38.     lis    r3,"ac"            ;load and shift into upper half
  39.     ori    r3,r3,"ur"        ;fill in the lower half
  40.     li    r4,0            ;resource ID number
  41.     Xcall    GetResource        ;MT-1-73
  42.     stw    r3,acurHandle(`bss)
  43.  
  44.     lwz    r13,(r3)        ;acur handle --> acur record
  45.     lhz    r14,(r13)        ;get the number of cursors
  46.     subi    r14,r14,1        ;we’ll index backwards thru the list
  47.     addi    r13,r13,4        ;point at the cursor ID list
  48.     la    r17,CursorHandles(`bss)    ;ptr to the array of cursor handles
  49.  
  50. SS1:    slwi    r16,r14,2        ;multiply it by 4
  51.     lhzx    r3,r13,r16        ;cursor ID number
  52.     Xcall    GetCursor        ;I-8-24
  53.     stwx    r3,r17,r16        ;store the handle in the array
  54.  
  55.     subic.    r14,r14,1        ;decrement number of cursors index
  56.     bge    SS1            ;we COULD get these guys on the fly, but…
  57.  
  58. WindowSetup:
  59.     li    r3,128            ;window ID is 128
  60.     li    r4,0            ;use heap for record
  61.     li    r5,-1            ;make it the front window
  62.     Xcall    GetNewCWindow        ;TE-4-76
  63.     stw    r3,WindowPtr(`bss)
  64.  
  65.      Xcall    SetPort            ;I-2-42: WindowPtr in r3
  66.  
  67.     li    r3,128            ;control ID
  68.     lwz    r4,WindowPtr(`bss)    ;window ptr (control owner)
  69.     Xcall    GetNewControl        ;TE-5-81
  70.     stw    r3,VScrollHandle(`bss)
  71.  
  72. TextSetup:
  73.     li    r3,monaco        ;T-4-15: font family ID
  74.     Xcall    TextFont        ;T-3-69
  75.  
  76.     li    r3,9            ;font size: 9 point
  77.     Xcall    TextSize        ;T-3-73
  78.  
  79.     li    r3,0            ;text face: 0 = plain style
  80.     Xcall    TextFace        ;T-3-69
  81.  
  82.     li    r3,srcOr        ;text mode
  83.     Xcall    TextMode        ;T-3-70
  84.  
  85.     la    r3,FontInfo(`bss)    ;VAR: FontInfo record: T-3-66
  86.     Xcall    GetFontInfo        ;T-3-75
  87.  
  88.     lwz    r3,WindowPtr(`bss)
  89.     la    r3,portRect(r3)        ;dest rect = portRect
  90.     mr    r4,r3            ;view rect = portRect
  91.     Xcall    TENew            ;T-2-78
  92.     stw    r3,TEHandle(`bss)
  93.  
  94.     bl    SizeDest        ;we’ll do these again after the window is sized
  95.     bl    SizeView
  96.  
  97.     lwz    r3,TEHandle(`bss)
  98.     lwz    r3,(r3)            ;TEHandle --> ptr to edit record
  99.     la    r4,FontInfo(`bss)    ;ptr to FontInfo data record
  100.     lhz    r5,(r4)            ;ascent
  101.     sth    r5,fontAscent(r3)    ;fontAscent
  102.     lhz    r6,descent(r4)
  103.     add    r5,r5,r6        ;+ descent
  104.     lhz    r6,leading(r4)
  105.     add    r5,r5,r6        ;+ leading
  106.     sth    r5,lineHeight(r3)    ; = line height
  107.     li    r4,monaco
  108.     sth    r4,teFont(r3)        ;teFont = Monaco
  109.     li    r4,9
  110.     sth    r4,teSize(r3)        ;teSize = 9 point
  111.  
  112. MakeMenu:
  113.     li    r3,128            ;MBAR resource ID
  114.     Xcall    GetNewMBar        ;TE-3-111
  115.     stw    r3,MBARHandle(`bss)
  116.     
  117.     Xcall    SetMenuBar        ;TE-3-112
  118.  
  119.     li    r3,128            ;menu ID for Apple menu
  120.     Xcall    GetMenuHandle        ;TE-3-122
  121.     stw    r3,AppleMenuHandle(`bss)    ;needed for DAs (remember them?)
  122.  
  123.     lwz    r3,AppleMenuHandle(`bss)
  124.     lis    r4,"DR"            ;load and shift into upper half
  125.     ori    r4,r4,"VR"        ;fill in the low half
  126.     Xcall    AppendResMenu        ;TE-3-128
  127.  
  128.     li    r3,130            ;menu ID for Edit menu
  129.     Xcall    GetMenuHandle        ;TE-3-122
  130.     stw    r3,EditMenuHandle(`bss)
  131.  
  132.     lwz    r3,EditMenuHandle(`bss)
  133.     li    r4,0            ;item number: 0 = whole menu
  134.     Xcall    DisableItem        ;TE-3-131
  135.  
  136.     li    r3,131            ;menu ID for Options menu
  137.     Xcall    GetMenuHandle        ;TE-3-122
  138.     stw    r3,OptionMenuHandle(`bss)
  139.  
  140.     Xcall    DrawMenuBar        ;TE-3-113
  141.  
  142. AlmostReady:
  143.     bl    CenterWindow        ;center the window on the screen
  144.  
  145.     bl    AdjustWindowSize    ;size the window to fit the screen
  146.     bl    SizeDest        ;adjust dest rect to window size
  147.     bl    SizeView        ;adjust view rect to window size
  148.     bl    SizeScrollBar        ;fit scroll bar in window
  149.  
  150.     lwz    r3,WindowPtr(`bss)
  151.      Xcall    ShowWindow        ;TE-4-88: make the window visible
  152.  
  153.     bl    GetTheResources        ;read in the ROM resources
  154.  
  155.     bl    CalControl        ;calibrate the scroll bar to the text
  156.  
  157.     bl    SaveTheResources    ;put the resources in a ResEdit file
  158.  
  159.     li    r3,everyEvent        ;TE-2-26: whichMask: -1 = everyEvent
  160.     li    r4,0            ;TE-2-26: stopMask: 0 = all events
  161.     Xcall    FlushEvents        ;TE-2-93
  162.  
  163. EventLoop:
  164.     li    r3,everyEvent        ;TE-2-85: eventMask: -1 = everyEvent
  165.     la    r4,theEvent(`bss)    ;VAR: TE-2-79: EventRecord
  166.     lhz    r5,MyCaretTime(`bss)    ;sleep time in ticks
  167.     li    r6,0            ;mouseRgn
  168.     Xcall    WaitNextEvent        ;TE-2-85
  169.  
  170.     lhz    r3,What+theEvent(`bss)    ;TE-2-79: event code
  171.  
  172.     cmpwi    r3,1            ;MouseDown
  173.     beq    MouseDown
  174.  
  175.     cmpwi    r3,3            ;KeyDown
  176.     beq    KeyDown
  177.  
  178.     cmpwi    r3,5            ;AutoKey
  179.     beq    KeyDown
  180.  
  181.     cmpwi    r3,6            ;Update
  182.     beq    UpdateEvent
  183.  
  184.     cmpwi    r3,8            ;Activate
  185.     beq    ActivateEvent
  186.  
  187.     cmpwi    r3,15            ;OSEvent
  188.     beq    OSEvent
  189.  
  190.     cmpwi    r3,23            ;high-level event
  191.     beq    HighLevelEvent
  192.  
  193.     b    EventLoop        ;none of the above
  194.  
  195. MouseDown:
  196.     lwz    r3,thePt+theEvent(`bss)    ;point where mouse was clicked from WaitNextEvent
  197.     la    r4,whichWindow(`bss)    ;VAR: window in which mousedown occurred
  198.     Xcall    FindWindow        ;TE-4-91
  199.     sth    r3,partCode(`bss)    ;TE-4-92: (for ZoomWindow)
  200.  
  201.     cmpwi    r3,8            ;highest code we know about
  202.     bgt    EventLoop    
  203.  
  204.     la    r4,[t]InDeskx(rtoc)    ;our MouseDown jump table
  205.     slwi    r3,r3,2            ;x4 to index into the table
  206.     lwzx    r4,r3,r4        ;get the address of the routine
  207.     mtctr    r4            ;put the address in the CTR register
  208.     bctr                ;branch to CTR
  209.  
  210.     b    EventLoop        ;shouldn’t get here
  211.  
  212. *  0: click in desk    InDeskx
  213. *  1: in menu bar    DoMenu
  214. *  2: in DA’s window    InSysWindowx
  215. *  3: select a window    InContentx
  216. *  4: in title bar    DoDrag
  217. *  5: in grow box    DoGrow
  218. *  6: in close box    DoGoAway
  219. *  7: in zoom box    DoZoomIn
  220. *  8: in zoom box    DoZoomOut
  221.  
  222. InDeskx:    toc_routine
  223.     b    EventLoop        ;we ignore clicks in the desktop
  224.  
  225. DoMenu:        toc_routine
  226.     lwz    r3,thePt+theEvent(`bss)
  227.     Xcall    MenuSelect        ;TE-3-115: returns r3 = menusID:ItemID
  228.     stw    r3,MenuResult(`bss)
  229.  
  230. Menu2:    srwi    r3,r3,16        ;we want to look at the menu ID number
  231.  
  232.     cmpwi    r3,128            ;is it Apple?
  233.     beq    AppleMenu
  234.  
  235.     cmpwi    r3,129            ;is it File?
  236.     beq    FileMenu
  237.  
  238.     cmpwi    r3,130            ;is it Edit?
  239.     beq    EditMenu
  240.  
  241.     cmpwi    r3,131            ;is it Options?
  242.     beq    OptionsMenu
  243.  
  244. MenuExit:
  245.     li    r3,0            ;0 = kill hiliting
  246.     Xcall    HiliteMenu        ;TE-3-119
  247.  
  248.     b    EventLoop
  249.  
  250. AppleMenu:
  251.     lhz    r3,itemID+MenuResult(`bss)    ;get itemID
  252.     cmpwi    r3,1            ;is it About?
  253.     beq    DoAbout
  254.  
  255.     la    r3,OldPort(`bss)
  256.     Xcall    GetPort            ;I-2-41
  257.  
  258.     lwz    r3,AppleMenuHandle(`bss)
  259.     lhz    r4,itemID+MenuResult(`bss)    ;get itemID
  260.     la    r5,itemString(`bss)    ;VAR: name of DA
  261.     Xcall    GetMenuItemText        ;TE-3-132
  262.  
  263.     lwz    r3,EditMenuHandle(`bss)
  264.     li    r4,0            ;item number: 0 = whole menu
  265.     Xcall    EnableItem        ;TE-3-131
  266.  
  267.     la    r3,itemString(`bss)    ;name of DA
  268.     Xcall    OpenDeskAcc        ;D-1-65
  269.     sth    r3,DARefNum(`bss)    ;save DA refNum
  270.  
  271.     la    r3,OldPort(`bss)    ;restore the port
  272.      Xcall    SetPort            ;I-2-42
  273.  
  274.     lwz    r3,EditMenuHandle(`bss)
  275.     li    r4,0            ;item number: 0 = whole menu
  276.     Xcall    DisableItem        ;TE-3-131
  277.  
  278.     Xcall    DrawMenuBar        ;TE-3-113
  279.  
  280.     b    MenuExit
  281.  
  282. DoAbout:
  283.     la    r3,OldPort(`bss)
  284.     Xcall    GetPort            ;I-2-41
  285.  
  286.     li    r3,geneva        ;T-4-15: font family ID
  287.     Xcall    SetDialogFont        ;TE-6-105
  288.  
  289.     li    r3,128            ;Dialog #128 is About
  290.     li    r4,0            ;use heap for DStorage
  291.     li    r5,-1            ;in front
  292.     Xcall    GetNewDialog        ;TE-6-113
  293.     stw    r3,DialogPtr(`bss)
  294.  
  295.      Xcall    SetPort            ;I-2-42
  296.  
  297.     li    r3,9            ;font size: 9 point
  298.     Xcall    TextSize        ;T-3-73
  299.  
  300.     lwz    r3,AboutText(rtoc)    ;ptr to the text
  301.     lwz    r4,AboutTextEnd(rtoc)
  302.     lwz    r5,AboutText(rtoc)
  303.     sub    r4,r4,r5        ;get the length of the text
  304.     lwz    r5,DialogPtr(`bss)
  305.     la    r5,portRect(r5)
  306.     la    r6,textRect(`bss)    ;rect to display the text in (local coordinates)
  307.     lis    r8,3
  308.     ori    r8,r8,3            ;now it’s $00030003
  309.     stw    r8,topLeft(r6)        ;+3 for top, +3 for left
  310.     lwz    r7,bottomRight(r5)
  311.     sub    r7,r7,r8        ;-3 for bottom, -3 for right
  312.     stw    r7,bottomRight(r6)
  313.     li    r6,teCenter        ;T-2-89: type of text alignment
  314.     Xcall    TETextBox        ;T-2-88
  315.  
  316. DA1:    li    r3,$002E        ;TE-2-85: EventMask: mouse & keyboard events
  317.     la    r4,theEvent(`bss)    ;TE-2-79: EventRecord
  318.     lhz    r5,MyCaretTime(`bss)    ;sleep time in ticks
  319.     li    r6,0            ;mouseRgn
  320.     Xcall    WaitNextEvent        ;TE-2-85
  321.     cmpwi    r3,FALSE        ;TRUE means we got a mouse or keyboard event
  322.     beq    DA1
  323.  
  324.     lwz    r3,DialogPtr(`bss)    ;got a hit: dump the dialog
  325.     Xcall    DisposeDialog        ;TE-6-120
  326.  
  327.     lwz    r3,OldPort(`bss)    ;back to the old port
  328.      Xcall    SetPort            ;I-2-42
  329.  
  330.     li    r3,systemFont        ;T-4-15: font family ID
  331.     Xcall    SetDialogFont        ;TE-6-105
  332.  
  333.     b    MenuExit
  334.  
  335. FileMenu:
  336.     b    Quit            ;nothing else implemented
  337.  
  338. EditMenu:
  339.     lhz    r3,itemID+MenuResult(`bss)    ;get itemID
  340.     subi    r3,r3,1            ;offset for SystemEdit
  341.     Xcall    SystemEdit        ;TE-3-122
  342.     cmpwi    r3,FALSE        ;TRUE if DA handled command
  343.     bne    MenuExit
  344.  
  345.     lhz    r3,itemID+MenuResult(`bss)    ;get itemID
  346.     cmpwi    r3,1            ;is it Undo?
  347.     beq    MenuExit        ;sorry, no Undo-ing
  348.  
  349.     cmpwi    r3,3            ;Cut?
  350.     bne    EM1
  351.  
  352.     lwz    r3,TEHandle(`bss)
  353.     Xcall    TECut            ;T-2-94
  354.  
  355.     b    MenuExit
  356.  
  357. EM1:    cmpwi    r3,4            ;Copy?
  358.     bne    EM2
  359.  
  360.     lwz    r3,TEHandle(`bss)
  361.     Xcall    TECopy            ;T-2-95
  362.  
  363.     b    MenuExit
  364.  
  365. EM2:    cmpwi    r3,5            ;Paste?
  366.     bne    EM3
  367.  
  368.     lwz    r3,TEHandle(`bss)
  369.     Xcall    TEPaste            ;T-2-95
  370.  
  371.     b    MenuExit
  372.  
  373. EM3:    cmpwi    r3,6            ;Clear?
  374.     bne    MenuExit
  375.  
  376.     lwz    r3,TEHandle(`bss)
  377.     Xcall    TEDelete        ;T-2-93
  378.  
  379.     b    MenuExit
  380.  
  381. OptionsMenu:
  382.     lhz    r3,itemID+MenuResult(`bss)    ;get itemID
  383.     cmpwi    r3,1            ;is it normal scroll?
  384.     bne    SM1
  385.  
  386.     lwz    r3,OptionMenuHandle(`bss)
  387.     li    r4,1            ;item number 1 = Normal scroll
  388.     li    r5,TRUE            ;TRUE = check, FALSE = remove check
  389.     Xcall    CheckItem        ;TE-3-136
  390.  
  391.     lwz    r3,OptionMenuHandle(`bss)
  392.     li    r4,2            ;item number 2 = Smooth scroll
  393.     li    r5,FALSE        ;TRUE = check, FALSE = remove check
  394.     Xcall    CheckItem        ;TE-3-136
  395.  
  396.     li    r3,TRUE
  397.     sth    r3,NormalScroll(`bss)
  398.  
  399.     b    MenuExit
  400.  
  401. SM1    lwz    r3,OptionMenuHandle(`bss)
  402.     li    r4,1            ;item number 1 = Normal scroll
  403.     li    r5,FALSE        ;TRUE = check, FALSE = remove check
  404.     Xcall    CheckItem        ;TE-3-136
  405.  
  406.     lwz    r3,OptionMenuHandle(`bss)
  407.     li    r4,2            ;item number 2 = Smooth scroll
  408.     li    r5,TRUE            ;TRUE = check, FALSE = remove check
  409.     Xcall    CheckItem        ;TE-3-136
  410.  
  411.     li    r3,FALSE
  412.     sth    r3,NormalScroll(`bss)
  413.  
  414.     b    MenuExit
  415.  
  416. InSysWindowx:   toc_routine
  417.     la    r3,theEvent(`bss)    ;from WaitNextEvent
  418.     la    r4,whichWindow(`bss)    ;from FindWindow
  419.     Xcall    SystemClick        ;TE-2-94
  420.  
  421.     b    EventLoop
  422.  
  423. InContentx:    toc_routine
  424.     lwz    r3,WindowPtr(`bss)
  425.      Xcall    SetPort            ;I-2-42
  426.  
  427.     la    r3,MousePt(`bss)    ;I-2-27: local coordinates
  428.     Xcall    GetMouse        ;TE-2-108
  429.  
  430.     lwz    r3,MousePt(`bss)    ;local mouse coordinates
  431.     lwz    r4,whichWindow(`bss)    ;window ptr
  432.     la    r5,CtrlHandle(`bss)    ;VAR: handle to control
  433.     Xcall    FindControl        ;TE-5-89: returns partCode
  434.  
  435.     cmpwi    r3,0            ;0 = in content area, otherwise in a control
  436.     beq    EventLoop
  437.  
  438. InAControl:
  439.     cmpwi    r3,inUpButton        ;20 = $14
  440.     beq    DoUpButton
  441.     cmpwi    r3,inDownButton        ;21 = $15
  442.     beq    DoDownButton
  443.     cmpwi    r3,inPageUp        ;22 = $16
  444.     beq    DoPageUp
  445.     cmpwi    r3,inPageDown        ;23 = $17
  446.     beq    DoPageDown
  447.     cmpwi    r3,inThumb        ;129 = $81
  448.     beq    DoInThumb
  449.  
  450.     b    EventLoop        ;shouldn’t ever get here
  451.  
  452. DoUpButton:
  453.     lwz    r3,VScrollHandle(`bss)
  454.     li    r4,inUpButton
  455.     Xcall    HiliteControl        ;TE-5-98
  456.  
  457.     lwz    r13,TEHandle(`bss)    ;TERec handle
  458.     lwz    r13,(r13)        ;TERec handle --> TERec ptr
  459.     lhz    r13,lineHeight(r13)    ;save the lineHeight
  460.  
  461.     lhz    r14,NormalScroll(`bss)    ;for checking scrolling behavior
  462.  
  463.     lwz    r3,VScrollHandle(`bss)
  464.     Xcall    GetControlValue        ;TE-5-103
  465.     mr    r15,r3            ;hang on to this one, too
  466.  
  467. DUB1:    cmpwi    r15,0            ;compare to minimum value = 0
  468.     beq    DUB6            ;branch if at minimum
  469.  
  470.     lwz    r3,VScrollHandle(`bss)
  471.     subi    r15,r15,1        ;decrement control value
  472.     mr    r4,r15
  473.     Xcall    SetControlValue        ;TE-5-94
  474.  
  475.     cmpwi    r14,FALSE        ;what kind of scrolling are we doing?
  476.     bne    DUB4
  477.  
  478.     mr    r16,r13            ;lineHeight = amount to scroll
  479. DUB3:    li    r3,0            ;dh
  480.     li    r4,1            ;dv: scroll one pixel line at a time
  481.     lwz    r5,TEHandle(`bss)
  482.     Xcall    TEScroll        ;T-2-91
  483.     subic.    r16,r16,1
  484.     bne    DUB3            ;go back around until we’ve scrolled one line’s worth
  485.     
  486.     b    DUB6
  487.  
  488. DUB4:    li    r3,0            ;dh
  489.     mr    r4,r13            ;dv = lineHeight = amount to scroll
  490.     lwz    r5,TEHandle(`bss)
  491.     Xcall    TEScroll        ;T-2-91
  492.  
  493. DUB6:    Xcall    Button            ;TE-2-108
  494.     cmpwi    r3,FALSE        ;returns boolean button state: TRUE = button down
  495.     beq    DUBx            ;exit if button is up
  496.  
  497.     la    r3,MousePt(`bss)    ;VAR: local coordinates
  498.     Xcall    GetMouse        ;TE-2-108
  499.  
  500.     lwz    r3,VScrollHandle(`bss)
  501.     lwz    r4,MousePt(`bss)
  502.     Xcall    TestControl        ;TE-5-93: returns partCode in r3
  503.  
  504.     cmpwi    r3,inUpButton        ;20 = $14
  505.     beq    DUB1            ;scroll some more if we’re still in the up button
  506.     b    DUB6            ;keep looping as long as the button is down
  507.  
  508. DUBx:    lwz    r3,VScrollHandle(`bss)
  509.     li    r4,0            ;normal hiliting
  510.     Xcall    HiliteControl           ;TE-5-98
  511.  
  512.     b    EventLoop
  513.  
  514. DoDownButton:
  515.     lwz    r3,VScrollHandle(`bss)
  516.     li    r4,inDownButton
  517.     Xcall    HiliteControl        ;TE-5-98
  518.  
  519.     lwz    r13,TEHandle(`bss)    ;TERec handle
  520.     lwz    r13,(r13)        ;TERec handle --> TERec ptr
  521.     lhz    r13,lineHeight(r13)    ;save the lineHeight
  522.  
  523.     lwz    r3,VScrollHandle(`bss)
  524.     Xcall    GetControlMaximum    ;TE-5-104
  525.     mr    r14,r3            ;put it where it will stick around
  526.  
  527.     lwz    r3,VScrollHandle(`bss)
  528.     Xcall    GetControlValue        ;TE-5-103
  529.     mr    r15,r3            ;hang on to this one, too
  530.  
  531.     lhz    r17,NormalScroll(`bss)    ;for checking scrolling behavior
  532.  
  533. DDB1:    cmpw    r15,r14            ;compare to maximum value
  534.     bge    DDB6            ;branch if too big
  535.  
  536.     lwz    r3,VScrollHandle(`bss)
  537.     addi    r15,r15,1        ;increment control value
  538.     mr    r4,r15
  539.     Xcall    SetControlValue        ;TE-5-94
  540.  
  541.     cmpwi    r17,FALSE        ;type of scrolling
  542.     bne    DDB4
  543.  
  544.     mr    r16,r13            ;lineHeight = amount to scroll
  545. DDB3:    li    r3,0            ;dh
  546.     li    r4,-1            ;dv: scroll one pixel line at a time
  547.     lwz    r5,TEHandle(`bss)
  548.     Xcall    TEScroll        ;T-2-91
  549.     subic.    r16,r16,1
  550.     bne    DDB3            ;go back around until we’ve scrolled one line’s worth
  551.     
  552.     b    DDB6
  553.  
  554. DDB4:    li    r3,0            ;dh
  555.     mr    r4,r13            ;lineHeight = amount to scroll
  556.     neg    r4,r4            ;negative to go up
  557.     lwz    r5,TEHandle(`bss)
  558.     Xcall    TEScroll        ;T-2-91
  559.  
  560. DDB6:    Xcall    Button            ;TE-2-108
  561.     cmpwi    r3,FALSE        ;returns boolean button state: TRUE = button down
  562.     beq    DDBx            ;exit if button is up
  563.  
  564.     la    r3,MousePt(`bss)    ;VAR: local coordinates
  565.     Xcall    GetMouse        ;TE-2-108
  566.  
  567.     lwz    r3,VScrollHandle(`bss)
  568.     lwz    r4,MousePt(`bss)
  569.     Xcall    TestControl        ;TE-5-93: returns partCode in r3
  570.  
  571.     cmpwi    r3,inDownButton        ;21 = $15
  572.     beq    DDB1            ;scroll some more if we’re still in the down button
  573.     b    DDB6            ;stay here while the button is down
  574.  
  575. DDBx:    lwz    r3,VScrollHandle(`bss)
  576.     li    r4,0            ;normal hiliting
  577.     Xcall    HiliteControl           ;TE-5-98
  578.  
  579.     b    EventLoop
  580.  
  581. DoPageUp:
  582.     lwz    r3,TEHandle(`bss)    ;TERec handle
  583.     lwz    r3,(r3)            ;TERec handle --> TERec ptr
  584.     la    r4,viewRect(r3)
  585.     lhz    r5,top(r4)
  586.     lhz    r6,bottom(r4)
  587.     sub    r6,r6,r5        ;get height of window
  588.     lhz    r14,lineHeight(r3)    ;the height of one line
  589.     divwu    r13,r6,r14        ;how many lines fit in the window
  590.     subi    r13,r13,1        ;to see one of the old lines
  591.  
  592. DPU1:    lwz    r3,VScrollHandle(`bss)
  593.     Xcall    GetControlValue        ;TE-5-103
  594.     cmpwi    r3,0            ;check it
  595.     beq    DPU6            ;don’t go lower than zero
  596.     
  597.     sub.    r4,r3,r13        ;control value - (# lines - 1)
  598.     mr    r15,r13
  599.     bge    DPU2            ;must be positive
  600.     mr    r15,r3            ;for TEScroll
  601.     li    r4,0            ;zero is minimum value
  602. DPU2:    lwz    r3,VScrollHandle(`bss)
  603.     Xcall    SetControlValue        ;TE-5-94
  604.  
  605.     li    r3,0            ;dh
  606.     mullw    r4,r14,r15        ;dv = lineHeight x (# of lines/window -1)
  607.     lwz    r5,TEHandle(`bss)
  608.     Xcall    TEScroll        ;T-2-91
  609.  
  610.     li    r3,6            ;6/60 = 1/10 second
  611.     la    r4,finalTicks(`bss)    ;VAR: value of Ticks at end of delay
  612.     Xcall    Delay            ;II-284 (doesn’t seem to be in new Inside Macintosh)
  613.  
  614. DPU6:    Xcall    Button            ;TE-2-108
  615.     cmpwi    r3,FALSE        ;returns boolean button state: TRUE = button down
  616.     beq    DPUx            ;exit if button is up
  617.  
  618.     la    r3,MousePt(`bss)    ;VAR: local coordinates
  619.     Xcall    GetMouse        ;TE-2-108
  620.  
  621.     lwz    r3,VScrollHandle(`bss)
  622.     lwz    r4,MousePt(`bss)
  623.     Xcall    TestControl        ;TE-5-93: returns partCode in r3
  624.  
  625.     cmpwi    r3,inPageUp        ;22 = $16
  626.     beq    DPU1            ;keep scrolling if we’re still in the page up area
  627.  
  628. DPUx:    b    EventLoop
  629.  
  630. DoPageDown:
  631.     lwz    r3,TEHandle(`bss)    ;TERec handle
  632.     lwz    r3,(r3)            ;TERec handle --> TERec ptr
  633.     la    r4,viewRect(r3)
  634.     lhz    r5,top(r4)
  635.     lhz    r6,bottom(r4)
  636.     sub    r6,r6,r5        ;get height of window
  637.     lhz    r14,lineHeight(r3)    ;the height of one line
  638.     divwu    r13,r6,r14        ;how many lines fit in the window
  639.     subi    r13,r13,1        ;to see one of the old lines
  640.  
  641.     lwz    r3,VScrollHandle(`bss)
  642.     Xcall    GetControlMaximum    ;TE-5-104
  643.     mr    r15,r3            ;put it where it will stick around
  644.  
  645. DPD1:    lwz    r3,VScrollHandle(`bss)
  646.     Xcall    GetControlValue        ;TE-5-103
  647.     cmpw    r3,r15            ;check against maximum value
  648.     bge    DPD6            ;branch if too big
  649.  
  650.     add    r4,r3,r13        ;control value + (# lines - 1)
  651.     mr    r16,r13            ;for TEScroll
  652.     cmpw    r4,r15            ;compare to max value
  653.     ble    DPD2            ;OK if <= max
  654.     sub    r16,r15,r3        ;difference between present & max is amount to scroll
  655.     mr    r4,r15            ;go to max value
  656. DPD2:    lwz    r3,VScrollHandle(`bss)
  657.     Xcall    SetControlValue        ;TE-5-94
  658.  
  659.     li    r3,0            ;dh
  660.     mullw    r4,r14,r16        ;dv = lineHeight x (# of lines to scroll)
  661.     neg    r4,r4            ;negative to go up
  662.     lwz    r5,TEHandle(`bss)
  663.     Xcall    TEScroll        ;T-2-91
  664.  
  665.     li    r3,6            ;6/60 = 1/10 second
  666.     la    r4,finalTicks(`bss)    ;VAR: value of Ticks at end of delay
  667.     Xcall    Delay            ;II-284
  668.  
  669. DPD6:    Xcall    Button            ;TE-2-108
  670.     cmpwi    r3,FALSE        ;returns boolean button state: TRUE = button down
  671.     beq    DPDx            ;exit if button is up
  672.  
  673.     la    r3,MousePt(`bss)    ;VAR: local coordinates
  674.     Xcall    GetMouse        ;TE-2-108
  675.  
  676.     lwz    r3,VScrollHandle(`bss)
  677.     lwz    r4,MousePt(`bss)
  678.     Xcall    TestControl        ;TE-5-93: returns partCode in r3
  679.  
  680.     cmpwi    r3,inPageDown        ;23 = $17
  681.     beq    DPD1            ;keep scrolling if in the page down area
  682.  
  683. DPDx:    b    EventLoop
  684.  
  685. DoInThumb:
  686.     lwz    r3,VScrollHandle(`bss)
  687.     Xcall    GetControlValue        ;TE-5-103
  688.     mr    r13,r3            ;save it for later…
  689.  
  690.     lwz    r3,VScrollHandle(`bss)
  691.     lwz    r4,MousePt(`bss)    ;we got it ’way back
  692.     li    r5,0            ;no actionProc
  693.     Xcall    TrackControl        ;TE-5-90
  694.  
  695.     lwz    r3,VScrollHandle(`bss)
  696.     lwz    r3,(r3)            ;ptr to ControlRecord
  697.     lhz    r4,contrlValue(r3)    ;new control value
  698.     sub.    r4,r4,r13        ;get difference between new and old value
  699.     beq    DITx            ;don’t scroll if it didn’t change
  700.  
  701.     lwz    r3,TEHandle(`bss)
  702.     lwz    r3,(r3)            ;TERec ptr
  703.     lhz    r3,lineHeight(r3)
  704.     mullw    r4,r3,r4        ;dv = (lineHeight) x (# of lines)
  705.     neg    r4,r4
  706.     li    r3,0            ;dh
  707.     lwz    r5,TEHandle(`bss)
  708.     Xcall    TEScroll        ;T-2-91
  709.  
  710. DITx:    b    EventLoop
  711.  
  712. DoDrag:        toc_routine
  713.     Xcall    GetGrayRgn        ;TE-4-113: returns handle to desktop region
  714.  
  715.     lwz    r3,(r3)            ;handle --> ptr
  716.     la    r3,rgnBBox(r3)        ;now have desktop rect
  717.     la    r4,boundsRect(`bss)    ;boundsRect for DragWindow
  718.     lwz    r5,topLeft(r3)        ;get topLeft…
  719.     stw    r5,topLeft(r4)
  720.     lwz    r5,bottomRight(r3)    ;…and bottomRight
  721.     stw    r5,bottomRight(r4)
  722.     
  723.     lwz    r3,WindowPtr(`bss)
  724.     lwz    r4,thePt+theEvent(`bss)    ;where (global)
  725.     la    r5,boundsRect(`bss)
  726.     Xcall    DragWindow        ;TE-4-94        
  727.     
  728.     b    EventLoop
  729.  
  730. DoGrow:        toc_routine
  731.     lwz    r3,whichWindow(`bss)    ;window ptr
  732.     la    r3,portRect(r3)
  733.     Xcall    InvalRect        ;TE-4-107
  734.  
  735.     Xcall    GetGrayRgn        ;TE-4-113: returns handle to desktop region
  736.  
  737.     lwz    r3,(r3)            ;handle --> ptr
  738.     la    r3,rgnBBox(r3)        ;now have desktop rect
  739.     la    r4,sizeRect(`bss)    ;sizeRect for GrowWindow
  740.     lwz    r5,topLeft(r3)        ;get topLeft…
  741.     stw    r5,topLeft(r4)
  742.     lwz    r5,bottomRight(r3)    ;…and bottomRight
  743.     stw    r5,bottomRight(r4)
  744.     
  745.     lwz    r3,WindowPtr(`bss)
  746.     lwz    r4,thePt+theEvent(`bss)    ;global coordinates of mousedown
  747.     la    r5,sizeRect(`bss)    ;maximum size limits
  748.     Xcall    GrowWindow        ;TE-4-100: returns r3 = height:width
  749.  
  750.     mr    r4,r3                     ;new height
  751.     mr    r5,r3
  752.     srwi    r5,r5,16        ;new width
  753.     lwz    r3,WindowPtr(`bss)
  754.     li    r6,TRUE            ;fUpdate? (new area --> update region)
  755.     Xcall    SizeWindow        ;TE-4-101
  756.  
  757.     bl    SizeScrollBar        ;fit controls to new window size
  758.     bl    SizeDest
  759.     bl    SizeView        ;adjust to window size
  760.     bl    CalControl        ;calibrate scroll bar to new size
  761.  
  762.     lwz    r3,TEHandle(`bss)
  763.     Xcall    TECalText        ;T-2-89
  764.  
  765.     b    EventLoop
  766.  
  767. DoGoAway:    toc_routine
  768.     lwz    r3,whichWindow(`bss)    ;window ptr
  769.     lwz    r4,thePt+theEvent(`bss)    ;from WaitNextEvent
  770.     Xcall    TrackGoAway        ;TE-4-103: returns boolean: in/out of GoAway box on mouseup
  771.  
  772.     cmpwi    r3,FALSE        ;TRUE = in GoAway box
  773.     bne    Quit
  774.  
  775.     b    EventLoop
  776.  
  777. DoZoomIn:    toc_routine
  778. DoZoomOut:    toc_routine
  779.     lwz    r3,WindowPtr(`bss)
  780.     lwz    r4,thePt+theEvent(`bss)    ;where (global)
  781.     lhz    r5,partCode(`bss)    ;from FindWindow
  782.     Xcall    TrackBox        ;TE-4-101
  783.     cmpwi    r3,FALSE        ;see if it’s still in the zoom box
  784.     beq    DZx
  785.  
  786.     lwz    r3,WindowPtr(`bss)
  787.     lhz    r4,partCode(`bss)
  788.     li    r5,TRUE            ;bring to front?
  789.     Xcall    ZoomWindow        ;TE-4-102
  790.  
  791.     lwz    r3,WindowPtr(`bss)
  792.     lwz    r3,portRect(r3)
  793.     Xcall    InvalRect        ;TE-4-107
  794.  
  795.     bl    SizeScrollBar        ;fit control to new window size
  796.     bl    SizeView        ;adjust to window size
  797.     bl    CalControl        ;calibrate scroll bar to new size
  798.  
  799.     lwz    r3,TEHandle(`bss)
  800.     Xcall    TECalText        ;T-2-89
  801.  
  802. DZx:    b    EventLoop
  803.  
  804. KeyDown:
  805.     lhz    r4,Modify+theEvent(`bss)    ;TE-2-20: modifier flags
  806.     andi.    r4,r4,$0100        ;see if cmd key is down
  807.     beq    KD1            ;branch if not
  808.  
  809.     lbz    r3,Message+3+theEvent(`bss)    ;TE-2-40: the character code
  810.     Xcall    MenuKey            ;TE-3-117
  811.     stw    r3,MenuResult(`bss)    ;save the result
  812.  
  813.     cmpwi    r3,0            ;see if it’s one of our menu items
  814.     beq    EventLoop        ;outta here if no match
  815.  
  816.     b    Menu2            ;handle it
  817.  
  818. KD1:    lbz    r3,Message+3+theEvent(`bss)    ;get the character code
  819.     cmpwi    r3,$1F            ;check for control chars
  820.     ble    ControlChar        ;go check for up/dn arrow, home, end, pg up/dn
  821.  
  822.     b    EventLoop
  823.  
  824. ControlChar:                ;T-1-55: character codes
  825.     cmpwi    r3,$1E            ;$1E = up arrow
  826.     beq    UpArrow
  827.     cmpwi    r3,$1F            ;$1F = down arrow
  828.     beq    DownArrow
  829.     cmpwi    r3,$0B            ;$0B = page up
  830.     beq    PageUp
  831.     cmpwi    r3,$0C            ;$0C = page down
  832.     beq    PageDown
  833.     cmpwi    r3,$01            ;$01 = home
  834.     beq    Home
  835.     cmpwi    r3,$04            ;$04 = end
  836.     beq    ScrollToEnd
  837. ;    cmpwi    r3,$05            ;$05 = help
  838. ;    beq    Help            ;no help here (at least, not yet)
  839.  
  840.     b    EventLoop
  841.  
  842. UpArrow:
  843.     lwz    r3,VScrollHandle(`bss)
  844.     Xcall    GetControlValue        ;TE-5-103
  845.  
  846.     cmpwi    r3,0            ;compare to minimum value = 0
  847.     beq    UAx            ;exit if at minimum
  848.  
  849.     mr    r4,r3
  850.     subi    r4,r4,1            ;decrement control value
  851.     lwz    r3,VScrollHandle(`bss)
  852.     Xcall    SetControlValue        ;TE-5-94
  853.  
  854.     li    r3,0            ;dh
  855.     lwz    r5,TEHandle(`bss)    ;TERec handle
  856.     lwz    r4,(r5)            ;TERec handle --> TERec ptr
  857.     lhz    r4,lineHeight(r4)    ;dv = lineHeight = amount to scroll
  858.     Xcall    TEScroll        ;T-2-91
  859.  
  860. UAx:    b    EventLoop
  861.  
  862. DownArrow:
  863.     lwz    r3,VScrollHandle(`bss)
  864.     Xcall    GetControlMaximum    ;TE-5-104
  865.     mr    r13,r3            ;put it where it will stick around
  866.  
  867.     lwz    r3,VScrollHandle(`bss)
  868.     Xcall    GetControlValue        ;TE-5-103
  869.  
  870.     cmpw    r3,r13            ;compare to maximum value
  871.     bge    DAx            ;exit if too big
  872.  
  873.     mr    r4,r3
  874.     addi    r4,r4,1            ;increment control value
  875.     lwz    r3,VScrollHandle(`bss)
  876.     Xcall    SetControlValue        ;TE-5-94
  877.  
  878.     li    r3,0            ;dh
  879.     lwz    r5,TEHandle(`bss)    ;TERec handle
  880.     lwz    r4,(r5)            ;TERec handle --> TERec ptr
  881.     lhz    r4,lineHeight(r4)    ;dv = lineHeight = amount to scroll
  882.     neg    r4,r4            ;negative to go up
  883.     Xcall    TEScroll        ;T-2-91
  884.  
  885. DAx:    b    EventLoop
  886.  
  887. PageUp:
  888.     lwz    r3,TEHandle(`bss)    ;TERec handle
  889.     lwz    r3,(r3)            ;TERec handle --> TERec ptr
  890.     la    r4,viewRect(r3)
  891.     lhz    r5,top(r4)
  892.     lhz    r6,bottom(r4)
  893.     sub    r6,r6,r5        ;get height of window
  894.     lhz    r14,lineHeight(r3)    ;the height of one line
  895.     divwu    r13,r6,r14        ;how many lines fit in the window
  896.     subi    r13,r13,1        ;to see one of the old lines
  897.  
  898.     lwz    r3,VScrollHandle(`bss)
  899.     Xcall    GetControlValue        ;TE-5-103
  900.     cmpwi    r3,0            ;check it
  901.     beq    PUx            ;don’t go lower than zero
  902.     
  903.     sub.    r4,r3,r13        ;control value - (# lines - 1)
  904.     bge    DPU1            ;must be positive
  905.     mr    r13,r3            ;for TEScroll
  906.     li    r4,0            ;zero is minimum value
  907. PU1:    lwz    r3,VScrollHandle(`bss)
  908.     Xcall    SetControlValue        ;TE-5-94
  909.  
  910.     li    r3,0            ;dh
  911.     mullw    r4,r14,r13        ;dv = lineHeight x (# of lines/window - 1)
  912.     lwz    r5,TEHandle(`bss)
  913.     Xcall    TEScroll        ;T-2-91
  914.  
  915. PUx:    b    EventLoop
  916.  
  917. PageDown:
  918.     lwz    r3,TEHandle(`bss)    ;TERec handle
  919.     lwz    r3,(r3)            ;TERec handle --> TERec ptr
  920.     la    r4,viewRect(r3)
  921.     lhz    r5,top(r4)
  922.     lhz    r6,bottom(r4)
  923.     sub    r6,r6,r5        ;get height of window
  924.     lhz    r14,lineHeight(r3)    ;the height of one line
  925.     divwu    r13,r6,r14        ;how many lines fit in the window
  926.     subi    r13,r13,1        ;to see one of the old lines
  927.  
  928.     lwz    r3,VScrollHandle(`bss)
  929.     Xcall    GetControlMaximum    ;TE-5-104
  930.     mr    r15,r3            ;put it where it will stick around
  931.  
  932.     lwz    r3,VScrollHandle(`bss)
  933.     Xcall    GetControlValue        ;TE-5-103
  934.     cmpw    r3,r15            ;check against maximum value
  935.     bge    PDx            ;exit if too big
  936.  
  937.     add    r4,r3,r13        ;control value + (# lines - 1)
  938.     mr    r16,r13            ;for TEScroll
  939.     cmpw    r4,r15            ;compare to max value
  940.     ble    PD1            ;OK if <= max
  941.     sub    r16,r15,r3        ;difference between present & max is amount to scroll
  942.     mr    r4,r15            ;go to max value
  943. PD1:    lwz    r3,VScrollHandle(`bss)
  944.     Xcall    SetControlValue        ;TE-5-94
  945.  
  946.     li    r3,0            ;dh
  947.     mullw    r4,r14,r16        ;dv = lineHeight x (# of lines to scroll)
  948.     neg    r4,r4            ;negative to go up
  949.     lwz    r5,TEHandle(`bss)
  950.     Xcall    TEScroll        ;T-2-91
  951.  
  952. PDx:    b    EventLoop
  953.  
  954. Home:
  955.     lwz    r3,VScrollHandle(`bss)
  956.     Xcall    GetControlValue        ;TE-5-103
  957.  
  958.     cmpwi    r3,0            ;compare to minimum value = 0
  959.     beq    Hx            ;no scroll if already zero
  960.  
  961.     mr    r13,r3            ;save it
  962.  
  963.     li    r3,0            ;dh
  964.     lwz    r5,TEHandle(`bss)    ;TERec handle
  965.     lwz    r4,(r5)            ;TERec handle --> TERec ptr
  966.     lhz    r4,lineHeight(r4)
  967.     mullw    r4,r4,r13        ;dv = lineHeight * control value = amount to scroll
  968.     Xcall    TEScroll        ;T-2-91
  969.  
  970.     lwz    r3,VScrollHandle(`bss)
  971.     li    r4,0            ;new control value
  972.     Xcall    SetControlValue        ;TE-5-94
  973.  
  974. Hx:    b    EventLoop
  975.  
  976. ScrollToEnd:
  977.     lwz    r3,VScrollHandle(`bss)
  978.     Xcall    GetControlMaximum    ;TE-5-104
  979.     mr    r13,r3            ;put it where it will stick around
  980.  
  981.     lwz    r3,VScrollHandle(`bss)
  982.     Xcall    GetControlValue        ;TE-5-103
  983.  
  984.     sub.    r6,r13,r3        ;for TEScroll
  985.     beq    STEx            ;don’t scroll if we’re already there
  986.  
  987.     li    r3,0            ;dh
  988.     lwz    r5,TEHandle(`bss)    ;TERec handle
  989.     lwz    r4,(r5)            ;TERec handle --> TERec ptr
  990.     lhz    r4,lineHeight(r4)
  991.     mullw    r4,r4,r6        ;dv = lineHeight * control value = amount to scroll
  992.     neg    r4,r4
  993.     Xcall    TEScroll        ;T-2-91
  994.  
  995.     lwz    r3,VScrollHandle(`bss)
  996.     mr    r4,r13            ;new control value = maximum
  997.     Xcall    SetControlValue        ;TE-5-94
  998.  
  999. STEx:    b    EventLoop
  1000.  
  1001. UpdateEvent:
  1002.     lwz    r3,Message+theEvent(`bss)    ;window ptr
  1003.     lwz     r4,WindowPtr(`bss)
  1004.     cmpw    r3,r4
  1005.     bne    UEx            ;not for us
  1006.  
  1007.     lwz    r3,Message+theEvent(`bss)
  1008.     Xcall    BeginUpdate        ;TE-4-106
  1009.  
  1010.     bl    DrawWindow
  1011.  
  1012.     lwz    r3,WindowPtr(`bss)
  1013.     la    r3,portRect(r3)
  1014.     lwz    r4,TEHandle(`bss)
  1015.     Xcall    TEUpdate        ;T-2-88
  1016.  
  1017.     lwz    r3,VScrollHandle(`bss)
  1018.     Xcall    Draw1Control        ;TE-5-88
  1019.  
  1020.     lwz    r3,Message+theEvent(`bss)
  1021.     Xcall    EndUpdate        ;TE-4-107
  1022.  
  1023. UEx:    b    EventLoop
  1024.  
  1025. DrawWindow:
  1026.     mflr    r28
  1027.  
  1028.     lwz    r3,WindowPtr(`bss)
  1029.      Xcall    SetPort            ;I-2-42
  1030.  
  1031.     lwz    r3,WindowPtr(`bss)
  1032.     la    r3,portRect(r3)
  1033.     Xcall    EraseRect        ;I-3-61
  1034.  
  1035.     lwz    r3,WindowPtr(`bss)
  1036.     Xcall    DrawGrowIcon        ;TE-4-86
  1037.  
  1038.     mtlr    r28
  1039.     blr
  1040.  
  1041. ActivateEvent:
  1042.     la    r3,theEvent(`bss)
  1043.     lwz    r4,Message(r3)        ;window ptr
  1044.     lwz     r5,WindowPtr(`bss)
  1045.     cmpw    r4,r5
  1046.     bne    EventLoop        ;not for us
  1047.  
  1048.     lhz    r4,Modify(r3)        ;TE-2-20: EventRecord modifier flags
  1049.     andi.    r4,r4,activeFlag    ;TE-2-21: check activate flag
  1050.     beq    Deactivate        ;1 = activate
  1051.  
  1052. Activate:
  1053.     lwz    r3,WindowPtr(`bss)
  1054.      Xcall    SetPort            ;I-2-42
  1055.  
  1056.     lwz    r3,VScrollHandle(`bss)
  1057.     Xcall    ShowControl        ;TE-5-86
  1058.  
  1059.     lwz    r3,VScrollHandle(`bss)
  1060.     Xcall    GetControlMaximum    ;TE-5-104
  1061.     cmpwi    r3,0
  1062.     beq    EventLoop        ;need to hilite it if not zero
  1063.  
  1064.     lwz    r3,VScrollHandle(`bss)
  1065.     li    r4,0            ;TE-5-99: hiliteState: 0 = on, 255 = off
  1066.     Xcall    HiliteControl        ;TE-5-98
  1067.  
  1068.     b    EventLoop
  1069.  
  1070. Deactivate:
  1071.     lwz    r3,VScrollHandle(`bss)
  1072.     li    r4,255            ;TE-5-99: hiliteState: 0 = on, 255 = off
  1073.     Xcall    HiliteControl        ;TE-5-98
  1074.  
  1075.     b    EventLoop
  1076.  
  1077. OSEvent:
  1078.     lwz    r3,Message+theEvent(`bss)    ;TE-2-80: suspend or resume events
  1079.     andis.    r4,r3,$0100        ;see if it’s suspend/resume
  1080.     beq    EventLoop        ;exit if neither
  1081.  
  1082.     andi.    r3,r3,$0001        ;now check for suspend or resume
  1083.     beq    Deactivate        ;it’s suspend
  1084.  
  1085.     b    Activate        ;it’s resume
  1086.  
  1087. HighLevelEvent:                ;we’re actually cheating here, but it works...
  1088.     lwz    r3,theEvent(`bss)    ;EventRecord
  1089.     lwz    r4,Message(r3)        ;TE-2-68, IC-4-58: event class
  1090.     lis    r5,"ae"            ;load and shift into upper half
  1091.     ori    r5,r5,"vt"        ;fill in the low half
  1092.     cmpw    r4,r5
  1093.     bne    EventLoop        ;we don’t do 'FNDR' or 'sect' (Editions Manager) events
  1094.  
  1095.     lwz    r4,where(r3)        ;TE-2-68, IC-4-58: event ID
  1096.     lis    r5,"oa"
  1097.     ori    r5,r5,"ap"        ;open application
  1098.     cmpw    r4,r5
  1099.     beq    EventLoop        ;looks to me like we’re already open
  1100.  
  1101.     lis    r5,"pd"
  1102.     ori    r5,r5,"oc"        ;print document
  1103.     cmpw    r4,r5
  1104.     beq    EventLoop        ;we don’t print ’em
  1105.  
  1106.     lis    r5,"qu"
  1107.     ori    r5,r5,"it"        ;quit application
  1108.     cmpw    r4,r5
  1109.     beq    Quit            ;this we can handle
  1110.  
  1111.     lis    r5,"od"
  1112.     ori    r5,r5,"oc"        ;open document
  1113.     cmpw    r4,r5
  1114.     b    EventLoop        ;we don’t do this one either
  1115.  
  1116. GetTheResources:
  1117.     mflr    r29
  1118.  
  1119.     li    r3,ROMMapHndl        ;ROMMapHndl = $0B06
  1120.     lwz    r3,(r3)            ;ROMMapHndl --> ROM map handle
  1121.     lwz    r13,(r3)        ;ROM map handle --> ROM map ptr
  1122.     lhz    r14,24(r13)        ;offset to type list
  1123.     add    r14,r13,r14        ;point at type list
  1124.     lhz    r20,(r14)        ;get the indexed number of types
  1125.  
  1126.     lhz    r19,26(r13)        ;offset to resource name list
  1127.     add    r19,r19,r13        ;ptr to resource name list
  1128.  
  1129.     la    r15,2(r14)        ;point to first resource in type list
  1130.  
  1131. GTR1:    lhz    r16,4(r15)        ;number of resources of this type
  1132.     lhz    r17,6(r15)        ;offset to reference list
  1133.     add    r17,r17,r14        ;ptr to reference list for first resource
  1134.  
  1135. GTR2:    la    r18,String(`bss)    ;will become one line in the window
  1136.     lwz    r3,(r15)
  1137.     stw    r3,(r18)        ;resource type
  1138.     addi    r18,r18,3        ;it’s really 4, but we want to use the update form later
  1139.  
  1140.     lhz    r3,(r17)        ;resource ID
  1141.     bl    NumberToString        ;convert it to a string = theString(`bss)
  1142.  
  1143.     la    r3,theString(`bss)
  1144.     li    r4,8            ;want 8 chars, ID # right justified & padded with spaces
  1145.     lbz    r3,(r3)
  1146.     sub    r4,r4,r3        ;subtract out ID number length
  1147.     li    r5," "
  1148. GTR3:    stbu    r5,1(r18)        ;put in a space
  1149.     subic.    r4,r4,1
  1150.     bne    GTR3
  1151.  
  1152.     la    r3,theString(`bss)
  1153.     lbz    r4,(r3)            ;use the length byte as an index
  1154. GTR4:    lbzu    r5,1(r3)
  1155.     stbu    r5,1(r18)
  1156.     subic.    r4,r4,1
  1157.     bne    GTR4
  1158.  
  1159.     lhz    r3,2(r17)        ;offset from beginning of resource name list to name
  1160.     add    r3,r3,r19        ;ptr to name in resource name list
  1161.     lbz    r4,(r3)            ;get the string length byte
  1162.     cmpwi    r4,0            ;check string length
  1163.     beq    GTR7            ;don’t copy nothing
  1164.  
  1165.     li    r5,"  "            ;a couple of spaces
  1166.     sth    r5,1(r18)
  1167.     addi    r18,r18,2
  1168.  
  1169. GTR5:    lbzu    r5,1(r3)        ;get a byte of the resource name
  1170.     stbu    r5,1(r18)
  1171.     subic.    r4,r4,1            ;using the length byte as a loop counter
  1172.     bne    GTR5
  1173.  
  1174. GTR7:    li    r3,cr
  1175.     stbu    r3,1(r18)
  1176.     addi    r18,r18,1        ;we were pointing at the <cr>
  1177.  
  1178.     la    r3,String(`bss)        ;ptr to the string
  1179.     sub    r4,r18,r3        ;subtract end from beginning = length
  1180.     lwz    r5,TEHandle(`bss)
  1181.     Xcall    TEInsert        ;T-2-94
  1182.  
  1183.     addi    r17,r17,12        ;point to next entry in reference list
  1184.     subic.    r16,r16,1        ;decrement the resource index
  1185.     bge    GTR2            ;loop as long as we got some
  1186.  
  1187.     addi    r15,r15,8        ;point to next resource in type list
  1188.     subic.    r20,r20,1        ;decrement number of types counter
  1189.     bge    GTR1            ;loop ’til we run out of ’em
  1190.  
  1191.     mtlr    r29
  1192.     blr
  1193.  
  1194. NumberToString:                ;r3 = number to convert, must be -32768 thru 32767
  1195.     la    r4,theString(`bss)    ;the destination
  1196.     li    r6,1            ;our index into the string (will become length byte)
  1197.  
  1198.     cmpwi    r3,32767        ;$7FFF
  1199.     ble    NTS0            ;anything larger is considered a negative number
  1200.  
  1201.     li    r5,"-"
  1202.     stbx    r5,r4,r6        ;stick the minus sign in there
  1203.     addi    r6,r6,1            ;increment the index
  1204.  
  1205.     neg    r3,r3            ;now the upper 16 bits are all 1s, so...
  1206.     andi    r3,r3,$FFFF        ;...mask them off
  1207. ;    extsh    r3,r3            ;this would work too because high bit is always 0
  1208.  
  1209. NTS0:    cmpwi    r3,10000        ;see if it’s 10000 or more
  1210.     blt    NTS2
  1211.  
  1212.     li    r5,-1            ;we’ll build our digit here
  1213. NTS1:    subic.    r3,r3,10000
  1214.     addi    r5,r5,1
  1215.     bge    NTS1            ;loop until it goes negative
  1216.  
  1217.     ori    r5,r5,$30        ;ASCII-ize the digit
  1218.     stbx    r5,r4,r6        ;put it in the string
  1219.     addi    r6,r6,1            ;bump up the index
  1220.  
  1221.     addi    r3,r3,10000        ;make it positive again
  1222.     b    NTS3
  1223.  
  1224. NTS2:    cmpwi    r3,1000            ;see if it’s 1000 or more
  1225.     blt    NTS5
  1226.  
  1227. NTS3:    li    r5,-1            ;digit building area
  1228. NTS4:    subic.    r3,r3,1000
  1229.     addi    r5,r5,1
  1230.     bge    NTS4
  1231.  
  1232.     ori    r5,r5,$30        ;ASCII-ize the digit
  1233.     stbx    r5,r4,r6
  1234.     addi    r6,r6,1
  1235.  
  1236.     addi    r3,r3,1000
  1237.     b    NTS6
  1238.  
  1239. NTS5:    cmpwi    r3,100            ;you get the idea from the previous ones
  1240.     blt    NTS8
  1241.  
  1242. NTS6:    li    r5,-1
  1243. NTS7:    subic.    r3,r3,100
  1244.     addi    r5,r5,1
  1245.     bge    NTS7
  1246.  
  1247.     ori    r5,r5,$30        ;ASCII-ize it
  1248.     stbx    r5,r4,r6
  1249.     addi    r6,r6,1
  1250.  
  1251.     addi    r3,r3,100
  1252.     b    NTS9
  1253.  
  1254. NTS8:    cmpwi    r3,10
  1255.     blt    NTS11
  1256.  
  1257. NTS9:    li    r5,-1
  1258. NTS10:    subic.    r3,r3,10
  1259.     addi    r5,r5,1
  1260.     bge    NTS10
  1261.  
  1262.     ori    r5,r5,$30
  1263.     stbx    r5,r4,r6
  1264.     addi    r6,r6,1
  1265.  
  1266.     addi    r3,r3,10
  1267.  
  1268. NTS11:    ori    r3,r3,$30
  1269.     stbx    r3,r4,r6
  1270.  
  1271.     stb    r6,(r4)            ;put in the length byte
  1272.  
  1273.     blr
  1274.  
  1275. CenterWindow:
  1276.     mflr    r29
  1277.  
  1278.     Xcall    GetMainDevice        ;I-5-27
  1279.     stw    r3,GDHandle(`bss)    ;save the main graphics device handle
  1280.  
  1281.     lwz    r4,(r3)            ;GDHandle --> GDevice ptr (I-5-15)
  1282.  
  1283.     lwz    r3,WindowPtr(`bss)    ;TE-4-69: WindowRecord --> I-2-31: GrafPort
  1284.  
  1285.     lhz    r5,gdRect+top(r4)
  1286.     addi    r5,r5,50        ;menu height + title bar + fudge factor
  1287.  
  1288.     lhz    r7,gdRect+right(r4)    ;gdRect.right
  1289.     lhz    r6,portRect+right(r3)    ;portRect.right
  1290.     sub    r4,r7,r6        ;gdRect.right - portRect.right = horizontal white space
  1291.     li    r6,1
  1292.     srw    r4,r4,r6        ;divide by 2 to get the distance from the left edge of the screen
  1293.  
  1294.     lwz    r3,WindowPtr(`bss)    ;r4 = left, r5 = top of new window position
  1295.     li    r6,1            ;in front
  1296.     Xcall    MoveWindow        ;TE-4-95
  1297.  
  1298.     mtlr    r29
  1299.     blr
  1300.  
  1301. SizeDest:
  1302.     lwz    r3,WindowPtr(`bss)
  1303.     la    r3,portRect(r3)        ;window’s portRect
  1304.     lwz    r4,TEHandle(`bss)
  1305.     lwz    r4,(r4)            ;handle --> ptr to TERec
  1306.     la    r5,destRect(r4)        ;destRect
  1307.  
  1308.     lis    r6,3            ;move top down 3 pixels
  1309.     ori    r6,r6,3            ;move left in 3 pixels
  1310.     stw    r6,topLeft(r5)
  1311.  
  1312.     lhz    r6,bottom(r3)        ;get height of window
  1313.     subi    r6,r6,23        ;for scroll bar + border
  1314.     lhz    r7,lineHeight(r4)    ;height of one line
  1315.     divwu    r6,r6,r7        ;how many lines fit in the window
  1316.     mullw    r6,r6,r7        ;back to height, drop remainder
  1317.     addi    r6,r6,3            ;for the 3 pixels at the top
  1318.     sth    r6,bottom(r5)
  1319.  
  1320.     li    r6,1000            ;make destRect.right = 1000 (way out in right field)
  1321.     sth    r6,right(r5)
  1322.  
  1323.     blr
  1324.  
  1325. SizeView:
  1326.     lwz    r3,WindowPtr(`bss)
  1327.     la    r3,portRect(r3)        ;window’s portRect
  1328.     lwz    r4,TEHandle(`bss)
  1329.     lwz    r4,(r4)            ;handle --> ptr to TERec
  1330.     la    r5,viewRect(r4)        ;viewRect
  1331.  
  1332.     lis    r6,3            ;move top down 3 pixels
  1333.     ori    r6,r6,3            ;move left in 3 pixels
  1334.     stw    r6,topLeft(r5)
  1335.  
  1336.     lhz    r6,bottom(r3)        ;get height of window
  1337.     subi    r6,r6,20        ;for scroll bar
  1338.     lhz    r7,lineHeight(r4)    ;height of one line
  1339.     divwu    r6,r6,r7        ;how many lines fit in the window
  1340.     mullw    r6,r6,r7        ;back to height, drop remainder
  1341.     addi    r6,r6,3            ;’cause we’re 3 down from the top
  1342.     sth    r6,bottom(r5)
  1343.  
  1344.     lhz    r6,right(r3)
  1345.     subi    r6,r6,23        ;in 20 pixels for scroll bar & 3 for the border
  1346.     sth    r6,right(r5)
  1347.  
  1348.     blr
  1349.  
  1350. AdjustWindowSize:
  1351.     mflr    r29
  1352.  
  1353.     lwz    r3,WindowPtr(`bss)
  1354.     la    r3,portRect(r3)        ;window’s portRect
  1355.  
  1356.     lhz    r4,right(r3)
  1357.     lhz    r5,left(r3)
  1358.     sub    r4,r4,r5        ;right - left = width
  1359.  
  1360.     lwz    r6,GDHandle(`bss)    ;get the main graphics device handle
  1361.     lwz    r6,(r6)            ;GDHandle --> GDevice ptr (I-5-15)
  1362.     la    r6,gdRect(r6)        ;now have desktop rect
  1363.  
  1364.     lhz    r7,right(r6)        ;desktop width
  1365.     subi    r7,r7,20        ;the fudge factor: 10 pixels left & right
  1366.     cmpw    r4,r7
  1367.     ble    AWS1            ;OK if smaller
  1368.     mr    r4,r7            ;use the window width if too big
  1369.  
  1370. AWS1:    lhz    r5,bottom(r6)        ;screen height
  1371.     subi    r5,r5,65        ;a fudge factor to give us some foot room
  1372.  
  1373.     lwz    r3,WindowPtr(`bss)    ;r4 = new width, r5 = new height
  1374.     li    r6,1            ;fUpdate = true
  1375.     Xcall    SizeWindow        ;TE-4-101
  1376.  
  1377.     mtlr    r29
  1378.     blr
  1379.  
  1380. SizeScrollBar:
  1381.     mflr    r27
  1382.  
  1383.     lwz    r6,WindowPtr(`bss)
  1384.     la    r13,portRect(r6)    ;window’s portRect
  1385.  
  1386.     lwz    r3,VScrollHandle(`bss)
  1387.     li    r4,16            ;new width
  1388.     lhz    r5,bottom(r13)        ;get portRect.bottom
  1389.     subi    r5,r5,13        ;grow box + fudge factor = new height
  1390.     Xcall    SizeControl        ;TE-5-98
  1391.  
  1392.     lwz    r3,VScrollHandle(`bss)
  1393.     lhz    r4,right(r13)        ;get portRect.right
  1394.     subi    r4,r4,15        ;grow box + fudge factor = left
  1395.     li    r5,-1            ;top
  1396.     Xcall    MoveControl        ;TE-5-97
  1397.  
  1398.     mtlr    r27
  1399.     blr
  1400.  
  1401. CalControl:
  1402.     mflr    r27
  1403.  
  1404.     lwz    r3,TEHandle(`bss)
  1405.     lwz    r7,(r3)            ;TERec ptr
  1406.  
  1407.     la    r4,viewRect(r7)
  1408.     lhz    r5,bottom(r4)        ;get height of window
  1409.     lhz    r6,lineHeight(r7)    ;get the height of one line
  1410.     divwu    r4,r5,r6        ;how many lines fit in the window
  1411.  
  1412.     lwz    r3,VScrollHandle(`bss)
  1413.     lhz    r7,nLines(r7)        ;number of lines of text
  1414.     sub.    r4,r7,r4        ;- (# lines in the window)
  1415.     bge    CC1
  1416.     mr    r4,r7            ;if few lines, set to max window will hold
  1417. CC1:    Xcall    SetControlMaximum    ;TE-5-95
  1418.  
  1419.     lwz    r3,VScrollHandle(`bss)
  1420.     li    r4,0            ;new minimum value
  1421.     Xcall    SetControlMinimum    ;TE-5-95
  1422.  
  1423.     mtlr    r27
  1424.     blr
  1425.  
  1426. SaveTheResources:
  1427.     mflr    r29
  1428.  
  1429.     bl    NewResourceFile
  1430.  
  1431.     li    r3,ROMMapHndl        ;ROMMapHndl = $0B06
  1432.     lwz    r3,(r3)            ;ROMMapHndl --> ROM map handle
  1433.     lwz    r13,(r3)        ;ROM map handle --> ROM map ptr
  1434.     lhz    r14,24(r13)        ;offset to type list
  1435.     add    r14,r13,r14        ;point at type list
  1436.     lhz    r20,(r14)        ;get the indexed number of types
  1437.  
  1438.     lhz    r19,26(r13)        ;offset to resource name list
  1439.     add    r19,r19,r13        ;ptr to resource name list
  1440.  
  1441.     la    r15,2(r14)        ;point to first resource in type list
  1442.     li    r18,RomMapInsert    ;RomMapInsert = $0B9E, TmpResLoad = $0B9F
  1443.  
  1444.     lwz    r3,acurHandle(`bss)
  1445.     lwz    r3,(r3)            ;acur handle --> acur record
  1446.     lhz    r23,(r3)        ;get the number of cursors
  1447.     subi    r23,r23,1        ;indexing with a zero offset
  1448.     la    r21,CursorHandles(`bss)    ;ptr to the array of cursor handles
  1449.     li    r22,0            ;start current cursor count at zero
  1450.  
  1451. STR1:    lhz    r16,4(r15)        ;number of resources of this type
  1452.     lhz    r17,6(r15)        ;offset to reference list
  1453.     add    r17,r17,r14        ;ptr to reference list for first resource
  1454.  
  1455. STR2:    lwz    r3,(r15)        ;resource type
  1456.     la    r4,theType(`bss)
  1457.     stw    r3,(r4)            ;stash the type
  1458.  
  1459.     lhz    r3,(r17)        ;resource ID
  1460.     la    r4,theID(`bss)
  1461.     sth    r3,(r4)            ;put in the ID
  1462.  
  1463.     lhz    r3,2(r17)        ;offset from beginning of resource name list to name
  1464.     add    r3,r3,r19        ;ptr to name in resource name list
  1465.     lbz    r4,(r3)            ;get the string length byte
  1466.     la    r5,RsrcName(`bss)
  1467.     stb    r4,(r5)            ;put in the length byte
  1468.     cmpwi    r4,0            ;check string length
  1469.     beq    STR4            ;don’t try to copy it if there’s nothing there
  1470.  
  1471. STR3:    lbzu    r6,1(r3)        ;copy the resource name
  1472.     stbu    r6,1(r5)
  1473.     subic.    r4,r4,1
  1474.     bne    STR3
  1475.  
  1476. STR4:    li    r3,MapTrue        ;insert ROM map, load resource
  1477.     sth    r3,(r18)
  1478.  
  1479.     lwz    r3,theType(`bss)
  1480.     lhz    r4,theID(`bss)
  1481.     Xcall    GetResource        ;MT-1-73
  1482.     stw    r3,RsrcHandle(`bss)
  1483.  
  1484.     stw    r3,NewRsrcHandle(`bss)    ;old handle
  1485.     la    r3,NewRsrcHandle(`bss)    ;VAR: new handle
  1486.     Xcall    HandToHand        ;M-2-62
  1487.  
  1488.     lwz    r3,NewRsrcHandle(`bss)
  1489.     Xcall    HLock            ;M-2-45
  1490.  
  1491.     li    r3,MapTrue        ;insert ROM map, load resource
  1492.     sth    r3,(r18)
  1493.  
  1494.     lwz    r3,RsrcHandle(`bss)
  1495.     Xcall    DetachResource        ;MT-1-108
  1496.  
  1497.     lhz    r3,ResFileNumber(`bss)    ;need to do this BEFORE AddResource
  1498.     Xcall    UseResFile        ;MT-1-69
  1499.  
  1500.     lwz    r3,NewRsrcHandle(`bss)
  1501.     lwz    r4,theType(`bss)    ;rsrc type
  1502.     lhz    r5,theID(`bss)        ;rsrc ID
  1503.     la    r6,RsrcName(`bss)    ;rsrc name
  1504.     Xcall    AddResource        ;MT-1-90
  1505.  
  1506.     lhz    r3,ResFileNumber(`bss)    ;reference number
  1507.     Xcall    UpdateResFile        ;MT-1-92
  1508.  
  1509.     lwz    r3,NewRsrcHandle(`bss)
  1510.     Xcall    HUnlock            ;M-2-46
  1511.  
  1512.     lwz    r3,NewRsrcHandle(`bss)
  1513.     Xcall    HPurge            ;M-2-47
  1514.  
  1515.     lwz    r3,NewRsrcHandle(`bss)
  1516.     Xcall    ReleaseResource        ;MT-1-107
  1517.  
  1518. STR5:    addi    r17,r17,12        ;point to next entry in reference
  1519.     subic.    r16,r16,1        ;decrement the resource index
  1520.     bge    STR2            ;loop if there’re still some left
  1521.  
  1522.     slwi    r4,r22,2        ;multiply current cursor count by 4
  1523.     lwzx    r3,r21,r4        ;get an indexed handle
  1524.     lwz    r3,(r3)            ;cursor handle --> cursor ptr
  1525.     Xcall    SetCursor        ;I-8-25
  1526.  
  1527.     addi    r22,r22,1        ;up the index
  1528.     cmpw    r22,r23            ;see if we’ve gone through all of them
  1529.     ble    STR6
  1530.     li    r22,0            ;reset cursor count
  1531.  
  1532. STR6:    addi    r15,r15,8        ;point to next resource in type list
  1533.     subic.    r20,r20,1        ;decrement number of types counter
  1534.     bge    STR1            ;loop ’til there ain’t no more
  1535.  
  1536.     Xcall    InitCursor        ;I-8-22
  1537.  
  1538.     li    r3,CurApRefNum        ;back to ROM Sucker
  1539.     Xcall    UseResFile        ;MT-1-69
  1540.  
  1541.     lhz    r3,ResFileNumber(`bss)
  1542.     Xcall    CloseResFile        ;MT-1-110
  1543.  
  1544.     mtlr    r29
  1545.     blr
  1546.  
  1547. NewResourceFile:
  1548.     mflr    r28
  1549.  
  1550.     la    r3,HParamBlkPtr(`bss)    ;F-2-92: fileParam variant
  1551.     li    r4,0
  1552.     stw    r4,ioCompletion(r3)    ;no completion routine
  1553.     lwz    r5,ResFileName(rtoc)
  1554.     stw    r5,ioNamePtr(r3)
  1555.     sth    r4,ioVRefNum(r3)    ;volume number
  1556.     stw    r4,ioDirID(r3)        ;directory ID number
  1557.     Xcall    PBHDeleteSync        ;F-2-174
  1558.  
  1559.     li    r3,0            ;vRefNum
  1560.     li    r4,0            ;dirID
  1561.     lwz    r5,ResFileName(rtoc)    ;resource file name
  1562.     Xcall    HCreateResFile        ;MT-1-56
  1563.  
  1564.     li    r3,0            ;vRefNum
  1565.     li    r4,0            ;dirID
  1566.     lwz    r5,ResFileName(rtoc)    ;resource file name
  1567.     li    r6,fsRdWrPerm        ;MT-1-62: IO permission
  1568.     Xcall    HOpenResFile        ;MT-1-62
  1569.     sth    r3,ResFileNumber(`bss)    ;rsrc file refNum of the opened file
  1570.  
  1571.     la    r3,HParamBlkPtr(`bss)    ;F-2-194: CInfoPBRec_File variant
  1572.     li    r4,0
  1573.     stw    r4,ioCompletion(r3)    ;no completion routine
  1574.     lwz    r5,ResFileName(rtoc)
  1575.     stw    r5,ioNamePtr(r3)
  1576.     sth    r4,ioVRefNum(r3)    ;volume number
  1577.     sth    r4,ioFDirIndex(r3)    ;use ioNamePtr & ioVRefNum
  1578.     stw    r4,ioDirID(r3)        ;directory ID number
  1579.     Xcall    PBHGetFInfoSync        ;F-2-194
  1580.  
  1581.     la    r3,HParamBlkPtr(`bss)    ;F-2-196: CInfoPBRec_File variant
  1582.     li    r4,0
  1583.     stw    r4,ioCompletion(r3)    ;no completion routine
  1584.     lis    r5,"rs"
  1585.     ori    r5,r5,"rc"        ;fdType = "rsrc"
  1586.     stw    r5,ioFlFndrInfo(r3)
  1587.     lis    r5,"RS"
  1588.     ori    r5,r5,"ED"        ;fdCreator = "RSED"
  1589.     stw    r5,ioFlFndrInfo+4(r3)
  1590.     stw    r4,ioDirID(r3)        ;directory ID number
  1591.     Xcall    PBHSetFInfoSync        ;F-2-195
  1592.  
  1593.     mtlr    r28
  1594.     blr
  1595.  
  1596. Quit:
  1597.     tidy_up                ;ends with a blr back to the Finder
  1598.  
  1599.  
  1600. *********************************************************
  1601. AboutText:    data        ;text to go in the About… box
  1602.     DC.B    "ROM Sucker",$0D,$0D
  1603.     DC.B    "A little hack to let you look at the resources in your ROM.  Written "
  1604.     DC.B    "in 680x0 and PowerPC assembly language by",$0D,$0D
  1605.     DC.B    "Cliff Harris",$0D
  1606.     DC.B    "PO Box 4343",$0D
  1607.     DC.B    "Anaheim, CA 92803",$0D
  1608.     DC.B    "CliffH5@aol.com"
  1609. AboutTextEnd:    data
  1610.     align
  1611. ResFileName:    data
  1612.     PSTRING    "•ROM Resources"
  1613.     align
  1614. *********************************************************
  1615. *  Low memory globals
  1616. CurApRefNum:    EQU    $0900    ;reference number of current application’s resource file
  1617. ROMMapHndl:    EQU    $0B06    ;handle to ROM resource map
  1618. RomMapInsert:    EQU    $0B9E    ;set byte to $FF to put ROM in resource chain
  1619. TmpResLoad:    EQU    $0B9F    ;set byte to $FF to load resources
  1620. *  ASCII characters
  1621. cr:        EQU    $000D    ;carriage return
  1622. *  I-8-24: cursor types
  1623. iBeamCursor:    EQU    1    ;text selection cursor
  1624. crossCursor:    EQU    2    ;for drawing graphics
  1625. watchCursor:    EQU    4    ;wristwatch to indicate a short operation in progress
  1626. *  T-3-66: FontInfo record
  1627. ascent:        EQU    0    ;ascent
  1628. descent:    EQU    2    ;descent
  1629. leading:    EQU    6    ;leading
  1630. *  TE-5-89: control part codes
  1631. inButton:    EQU    10
  1632. inCheckBox:    EQU    11
  1633. inUpButton:    EQU    20
  1634. inDownButton:    EQU    21
  1635. inPageUp:    EQU    22
  1636. inPageDown:    EQU    23
  1637. inThumb:    EQU    129
  1638. *  TE-5-73: ControlRecord
  1639. contrlValue:    EQU    18
  1640. *  I-2-31: GrafPort
  1641. portBits:    EQU    2    ;bitmap
  1642. portRect:    EQU    16    ;grafPort’s rectangle
  1643. txFont:        EQU    68    ;text font
  1644. txFace:        EQU    70    ;text face
  1645. txMode:        EQU    72    ;text mode
  1646. txSize:        EQU    74    ;text size
  1647. *  I-5-15: GDevice record
  1648. gdRect:        EQU    34    ;GDevice rectangle
  1649. *  I-2-29: Region
  1650. rgnBBox:    EQU    2    ;region’s enclosing rectangle
  1651. *  T-2-67: TERec
  1652. destRect:    EQU    0
  1653. viewRect:    EQU    8
  1654. lineHeight:    EQU    24
  1655. fontAscent:    EQU    26
  1656. hText:        EQU    62    ;handle to the text
  1657. teFont:        EQU    74
  1658. teSize:        EQU    80
  1659. nLines:        EQU    94
  1660. *  constants for setting the RomMapInsert:TmpResLoad pair
  1661. MapTrue:    EQU    $FFFF    ;link in ROM map and load resource
  1662. MapFalse:    EQU    $FF00    ;link in ROM map without loading a resource
  1663. *  I-2-28: offsets for rectangles
  1664. top:        EQU    0
  1665. left:        EQU    2
  1666. bottom:        EQU    4
  1667. right:        EQU    6
  1668. topLeft:    EQU    0
  1669. botRight:    EQU    4
  1670. bottomRight:    EQU    4
  1671. *  T-4-15: font numbers
  1672. systemFont:    EQU    0
  1673. chicago:    EQU    0
  1674. geneva:        EQU    3
  1675. monaco:        EQU    4
  1676. *  TE-2-79: EventRecord
  1677. What:        EQU    0    ;TE-2-79: event type
  1678. Message:    EQU    2    ;TE-2-80: event message
  1679. When:        EQU    6    ;event time
  1680. where:        EQU    10    ;TE-2-80: event ID for high-level events
  1681. thePt:        EQU    10    ;global mouse posn: h,v
  1682. Modify:        EQU    14    ;TE-2-80: modifiers
  1683. *  TE-2-21: EventRecord modifier flags:
  1684. activeFlag:    EQU    1    ;set if window is being activated
  1685. *  TE-2-26: event mask
  1686. everyEvent:    EQU    -1    ;all events
  1687. *  MousePt (local mouse coordinates)
  1688. MouseV:        EQU    0    ;vertical coordinate
  1689. MouseH:        EQU    2    ;horizontal coordinate
  1690. *  TE-3-115: MenuResult (from MenuSelect)
  1691. menusID:    EQU    0    ;menu ID
  1692. itemID:        EQU    2    ;menu item ID
  1693. *  T-2-89: text alignment (was "justification") used by TETextBox
  1694. teFlushDefault:    EQU    0    ;whatever was already specified
  1695. teCenter:    EQU    1    ;centered
  1696. teFlushRight:    EQU    -1    ;right aligned
  1697. teFlushLeft:    EQU    -2    ;left aligned
  1698. *  T-2-73: transfer modes
  1699. srcOr:        EQU    1
  1700. *  F-2-91: HParamBlockRec
  1701. ioCompletion:    EQU    12    ;ptr to completion routine
  1702. ioNamePtr:    EQU    18    ;ptr to driver/file/directory name
  1703. ioVRefNum:    EQU    22    ;volume specification
  1704. ioFDirIndex:    EQU    28    ;set to zero to use ioNamePtr & ioVRefNum
  1705. ioFlFndrInfo:    EQU    32    ;FInfo = file type and creator
  1706. ioDirID:    EQU    48    ;directory or file ID
  1707. *  MT-1-62: IO permissions
  1708. fsRdWrPerm:    EQU    3    ;exclusive read/write permission
  1709. *********************************************************
  1710. DebugString:    pstring ";ss e80;g"
  1711.     align
  1712. *  Use the debug string as follows:
  1713. *    lwz    r3,DebugString(rtoc)
  1714. *    Xcall    DebugStr
  1715.  
  1716. *    stdx    r0,r0,r0    ;•••••••••••  it’s illegal!!!!  •••••••••••••••
  1717.  
  1718. *********************************************************
  1719.